package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.file.service.FileStorageService;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.WmMaterialDto;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.model.wemedia.pojos.WmNewsMaterial;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.mapper.WmNewsMaterialMapper;
import com.heima.wemedia.service.IWmMaterialService;
import com.heima.wemedia.uitls.ThreadLocalUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Date;
import java.util.UUID;

@Service
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements IWmMaterialService {
    @Autowired
    private FileStorageService fileStorageService;
    @Autowired
    private WmNewsMaterialMapper wmNewsMaterialMapper;
    /**
     * 图片上传
     * @param multipartFile
     * @return
     */
    @Override
    public ResponseResult uploadPicture(MultipartFile multipartFile) throws IOException {
        //校验请求参数中的图片文件是否存在
        if (multipartFile == null){
            //不存在则直接返回图片上传错误状态码,无效参数
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //存在则进行上传操作,将图片上传到minio中
        //获取一个UUID,将UUID中的横杠去掉
        String uuid = UUID.randomUUID().toString();
        //将uuid中的横岗替换成空字符串
        String fileName = uuid.replace("-", "");
        //获取文件的原始名称,按照"."进行切割,一个字符串数组
        String originalFilename = multipartFile.getOriginalFilename();
        String[] strings = originalFilename.split("\\.");
        //获取数组的最后一位
        String postfix = strings[strings.length - 1];
        //上传的文件名=uuid+.+postfix
        //调用方法执行图片上传操作
        String path = fileStorageService.uploadImgFile("", fileName + "." + postfix, multipartFile.getInputStream());
        //将数据进行封装后存入到数据库素材表中,创建一个素材对象
        WmMaterial wmMaterial = new WmMaterial();
        wmMaterial.setUserId(ThreadLocalUtils.getUser().getId());
        wmMaterial.setUrl(path);
        wmMaterial.setCreatedTime(new Date());
        wmMaterial.setType((short)0);
        wmMaterial.setIsCollection((short)0);
        //调用方法执行数据存储
        this.save(wmMaterial);
        //将结果封装并返回
        return ResponseResult.okResult(wmMaterial);
    }

    /**
     * 素材列表查询
     * @param dto
     * @return
     */
    @Override
    public ResponseResult listByPage(WmMaterialDto dto) {
        //构造分页查询条件
        Page<WmMaterial> page = new Page<>(dto.getPage(),dto.getSize());
        //构造条件查询的条件对象
        QueryWrapper<WmMaterial> queryWrapper = new QueryWrapper<>();
        //判断请求参数中的收藏状态为0 还是1
        if (dto.getIsCollection() != null && dto.getIsCollection() == 1){
            //当收藏参数为1时,只查询收藏的素材,以此构造条件查询条件
            queryWrapper.eq("is_collection",dto.getIsCollection());
        }
        //当收藏属性值为0,或者说不为1时,直接查询所有
        //根据用户id进行查询
        queryWrapper.eq("user_id",ThreadLocalUtils.getUser().getId());
        //按照创建时间进行排序
        queryWrapper.orderByDesc("created_time");
        //调用分页查询方法进行查询
        Page<WmMaterial> pageInfo = this.page(page, queryWrapper);
        //封装结果集
        PageResponseResult responseResult = new PageResponseResult();
        responseResult.setData(pageInfo.getRecords());
        responseResult.setCurrentPage(dto.getPage());
        responseResult.setTotal((int)pageInfo.getTotal());
        responseResult.setSize(dto.getSize());
        return responseResult;
    }

    /**
     * 素材删除,被文章引用无法删除
     * @param id
     * @return
     */
    @Override
    public ResponseResult deletePicture(Integer id) {
        //判断请求参数id是否存在
        if (id == null){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //请求参数中存在id,则去素材应用表中查询,该id是否被应用
        //调用方法去素材应用表中查询数据
        WmNewsMaterial newsMaterial = wmNewsMaterialMapper.selectById(id);
        //判断newsMaterial是否为空
        if (newsMaterial != null){
            //不为空则表示已经被应用了,不能删除,返回一个错误状态码即可
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"文件删除失败");
        }
        //根据id查询数据库中对应的素材,获取素材的路径,根据路径删除minio中的素材
        WmMaterial wmMaterial = this.getById(id);
        if (wmMaterial == null){
            return ResponseResult.errorResult(1002,"数据不存在");
        }
        String url = wmMaterial.getUrl();
        try {
            fileStorageService.delete(url);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.errorResult(501,"文件删除失败");
        }
        //调用方法执行删除操作,删除素材表中的素材数据
        this.removeById(id);
        return ResponseResult.errorResult(200,"操作成功");
    }

    /**
     * 素材取消收藏
     * @param id
     * @return
     */
    @Override
    public ResponseResult cancelCollect(Integer id) {
        //校验请求参数,判断id是否存在
        if (id == null){
            //id不存在,贼直接响应错误状态码
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //id存在,则根据id修改数据库中的素材,构造修改条件
        UpdateWrapper<WmMaterial> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("is_collection",0);
        this.update(updateWrapper);

        return ResponseResult.okResult(200,"操作成功");
    }

    /**
     * 素材收藏
     * @param id
     * @return
     */
    @Override
    public ResponseResult collect(Integer id) {
        //校验请求参数,判断id是否存在
        if (id == null){
            //id不存在,贼直接响应错误状态码
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //id存在,则根据id修改数据库中的素材,构造修改条件
        UpdateWrapper<WmMaterial> updateWrapper = new UpdateWrapper<>();
        updateWrapper.set("is_collection",1);
        this.update(updateWrapper);

        return ResponseResult.okResult(200,"操作成功");
    }
}
